# 财务云报表：应收应付款项统计表
# 科目余额表应展开：应付账款/长期应付款单位余额表
# 应检查：是否有内部单位，比如：物资公司

from openpyxl import load_workbook
from decimal import Decimal, ROUND_HALF_UP

from sys import path
path.append('d:/python&work')

from little_function.read import read_unit_by_table
from little_function.convert import convert_to_wan

def fill_in_account(cell, account, type='应付账款'):
    # 以单位名称所在单元格定位余额所在单元格
    if type == '应付账款':
        # 应付账款
        cell.offset(column=8).value = convert_to_wan(account)       # 将当前单元格向右移动8列，并写入余额
        cell.offset(column=16).value = convert_to_wan(account)
    elif type == '长期应付款':
        # 长期应付款
        cell.offset(column=9).value = convert_to_wan(account)
        cell.offset(column=19).value = convert_to_wan(account)
    else:
        print('不支持的类型：', type)

def fill_in(source_data, type='应付账款'):
    # 向报表中填充数据。因为应收应付款项统计表中需要填单位性质等信息，所以以统计表为主，在科目余额表中检索数据
    xlsx_file = "d:/statement.xlsx"
    wb = load_workbook(xlsx_file, data_only=True)
    ws = wb.active
    max_row = ws.max_row          # 获取工作表中有数据的区域
    for row in range(5, max_row):               # 清空需要填充的区域
        if type == '应付账款':
            # 应付账款
            ws['J' + str(row)].value = None
            ws['R' + str(row)].value = None
        elif type == '长期应付款':
            # 长期应付款
            ws['K' + str(row)].value = None
            ws['U' + str(row)].value = None
        else:
            print('不支持的类型：', type)
    for num, d in source_data.copy().items():
        name, account = d.values()
        for the_cell in ws['B'][4:]:        # 这里需要使用“[4:]”，否则会跳过第一行。因为这里是列表索引，不是工作表中的行号。
            if the_cell.value == name:
                fill_in_account(the_cell, account, type)
                source_data.pop(num)
    # 处理报表里没有，但科目余额表里有的单位
    if source_data:
        print(f'有 {len(source_data)} 个往来单位没有在报表中，正在添加')
        # 因为max_row并不可靠，所以需要遍历所有行，找到最后一行
        for row in range(5, max_row+2):
            if ws['B' + str(row)].value == None:      # 找到最后一行
                last_row = row
                break
        for d in source_data.values():
            name, account = d.values()
            if account == 0:
                print(f'{name} 的余额为 0，已自动忽略')
                continue
            the_cell = ws['B' + str(last_row)]
            the_cell.value = name
            fill_in_account(the_cell, account, type)
            last_row += 1
            print(f'已添加 {name}')
    # 将工程款改为 220201|工程款 ，防止导入识别错误
    for row in range(5, max_row+1):
        the_cell = ws['G' + str(row)]
        if the_cell.value == '工程款':
            the_cell.value = '220201|工程款'
    wb.save(xlsx_file)

source_data = read_unit_by_table('d:/source.xlsx')      # 获取科目余额表数据
type1 = '应付账款'
# type2 = '长期应付款'
fill_in(source_data, type=type1)